/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.uoc.tds.cliente;

import java.rmi.RemoteException;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.NumberFormat;
import java.text.DecimalFormat;
import javax.swing.text.NumberFormatter;
import javax.swing.table.AbstractTableModel;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import edu.uoc.tds.bean.*;
import edu.uoc.tds.common.*;

/**
 * Informe del porcentaje de asistencia en los eventos.
 *
 * @author Albert Calahorro.
 */
public class PantallaInformePorcentajeAsistenciaEventos extends javax.swing.JPanel {

    // DeclaraciÃ³n componentes y objetos.
    private RemotoInterface objServeis = null;
    private static final long serialVersionUID = 1L;
    private UtilLenguaje txt = null;

    private JLabel labelUniversidad;
    private JLabel labelCentro;
    private JLabel labelTipoEvento;
    private JLabel labelFechaInicio;
    private JLabel labelFechaFinal;
    private JLabel labelPorcentajeMax;
    private JLabel labelPorcentajeMin;

    private JComboBox comboUniversidad;
    private JComboBox comboCentro;
    private JComboBox comboTipoEvento;

    private JFormattedTextField textoFechaInicio;
    private JFormattedTextField textoFechaFinal;
    private final DateFormat FormatoFecha = new SimpleDateFormat("dd/MM/yyyy");

    private JFormattedTextField textoPorcentajeMax;
    private JFormattedTextField textoPorcentajeMin;

    private JButton botonBuscar;
    private JButton botonLimpiar;

    private JTable tabla = null;
    private JScrollPane jScrollPane = null;
    JScrollPane textScroll = null;

    private JTextField textoTotales;
    private JFormattedTextField textoTotalPlazas;
    private JFormattedTextField textoTotalInscritos;
    private JFormattedTextField textoTotalAsistentes;
    private JFormattedTextField textoTotalPorcentaje;

    public PantallaInformePorcentajeAsistenciaEventos(RemotoInterface pObjServeis) throws RemoteException {
        super();
        objServeis = pObjServeis;
        initComponents();
        CargarCentros(new Integer(((MostrarCombo) comboUniversidad.getSelectedItem()).getID()));
    }

    /**
    * MÃ©todo para pintar el panel y aÃ±adir los botones y demÃ¡s
    * componentes, asÃ­ como sus propiedades
    */
    private void initComponents()
    {
        this.setLayout(null);
        this.setBounds(new Rectangle(0, 0, 800, 300));

        // Fechas (Inicializadas a la fecha actual).
        labelFechaInicio = new JLabel();
        labelFechaInicio.setText(txt.getMessage("pantInformePorcentajeAsistencia.label.fechainicio"));
        labelFechaInicio.setBounds(70, 130, 100, 25);
        labelFechaInicio.setHorizontalTextPosition(4);
        this.add(labelFechaInicio);

        textoFechaInicio = new JFormattedTextField(FormatoFecha);
        textoFechaInicio.setBounds(150, 130, 80, 25);
        textoFechaInicio.setValue(new java.util.Date());
        this.add(textoFechaInicio);

        labelFechaFinal = new JLabel();
        labelFechaFinal.setText(txt.getMessage("pantInformePorcentajeAsistencia.label.fechafin"));
        labelFechaFinal.setBounds(315, 130, 100, 25);
        labelFechaFinal.setHorizontalTextPosition(4);
        this.add(labelFechaFinal);

        textoFechaFinal = new JFormattedTextField(FormatoFecha);
        textoFechaFinal.setBounds(390, 130, 80, 25);
        textoFechaFinal.setValue(new java.util.Date());
        this.add(textoFechaFinal);

        // Porcentajes.
        labelPorcentajeMin = new JLabel();
        labelPorcentajeMin.setText(txt.getMessage("pantInformePorcentajeAsistencia.label.porcentajemin"));
        labelPorcentajeMin.setBounds(15, 170, 150, 25);
        Integer horitz = labelPorcentajeMin.getHorizontalTextPosition();
        labelPorcentajeMin.setHorizontalTextPosition(4);
        this.add(labelPorcentajeMin);

        textoPorcentajeMin = new JFormattedTextField (new DecimalFormat("0"));
        textoPorcentajeMin.setBounds(150, 170, 80, 25);
        textoPorcentajeMin.setValue(new Integer(0));

        NumberFormatter nfMin = (NumberFormatter)textoPorcentajeMin.getFormatter();
        nfMin.setAllowsInvalid(false);
        //Valor mÃ­nimo y mÃ¡ximo
        nfMin.setMinimum(0);
        nfMin.setMaximum(100);

        labelPorcentajeMax = new JLabel();
        labelPorcentajeMax.setText(txt.getMessage("pantInformePorcentajeAsistencia.label.porcentajemax"));
        labelPorcentajeMax.setBounds(255, 170, 150, 25);
        labelPorcentajeMax.setHorizontalTextPosition(4);
        this.add(labelPorcentajeMax);

        textoPorcentajeMax = new JFormattedTextField (new DecimalFormat("0"));
        textoPorcentajeMax.setBounds(390, 170, 80, 25);
        textoPorcentajeMax.setValue(new Integer(100));

        NumberFormatter nfMax = (NumberFormatter)textoPorcentajeMax.getFormatter();
        nfMax.setAllowsInvalid(false);
        //Valor mÃ­nimo y mÃ¡ximo
        nfMax.setMinimum(0);
        nfMax.setMaximum(100);

        this.add(textoPorcentajeMin);
        this.add(textoPorcentajeMax);

        // Universidades.
        labelUniversidad = new JLabel();
        labelUniversidad.setText(txt.getMessage("pantInformePorcentajeAsistencia.label.universidad"));
        labelUniversidad.setBounds(75, 10, 100, 25);
        labelUniversidad.setHorizontalTextPosition(4);
        this.add(labelUniversidad);

        this.add(getComboUniversidad(), null);

        // Centros.
        labelCentro = new JLabel();
        labelCentro.setText(txt.getMessage("pantInformePorcentajeAsistencia.label.centro"));
        labelCentro.setBounds(105, 50, 100, 25);
        labelCentro.setHorizontalTextPosition(4);
        this.add(labelCentro);

        comboCentro = new JComboBox();
        comboCentro.setBounds(new Rectangle(150, 50, 320, 25));
        // Evento para cargar Tipos de Centro al seleccionar Centro.
        comboCentro.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evtC) {
                ComboCentroActionPerformed(evtC);
            }
        });
        this.add(comboCentro);
        //CargarCentros(0)

        // Tipos Evento.
        labelTipoEvento = new JLabel();
        labelTipoEvento.setText(txt.getMessage("pantInformePorcentajeAsistencia.label.tipoevento"));
        labelTipoEvento.setBounds(60, 90, 100, 25);
        labelTipoEvento.setHorizontalTextPosition(4);
        this.add(labelTipoEvento);

        comboTipoEvento = new JComboBox();
        comboTipoEvento.setBounds(new Rectangle(150, 90, 320, 25));
        this.add(comboTipoEvento);
        CargarTiposEvento(0);

        // Botones.
        this.add(getBotonBuscar(), null);

        // Tabla.
        tabla = new JTable();
        this.add(tabla);
        this.add(getJScrollPane(), null);
        jScrollPane.setViewportView(getTablaResultados());

        // Totales.
        textoTotales = new JTextField(txt.getMessage("pantInformePorcentajeAsistencia.texto.totales"));
        textoTotales.setBounds(300, 290, 55, 25);
        textoTotales.setEnabled(false);
        this.add(textoTotales);

        textoTotalPlazas = new JFormattedTextField (new DecimalFormat("0"));
        textoTotalPlazas.setBounds(355, 290, 55, 25);
        textoTotalPlazas.setEnabled(false);
        this.add(textoTotalPlazas);

        textoTotalInscritos = new JFormattedTextField (new DecimalFormat("0"));
        textoTotalInscritos.setBounds(410, 290, 55, 25);
        textoTotalInscritos.setEnabled(false);
        this.add(textoTotalInscritos);

        textoTotalAsistentes = new JFormattedTextField (new DecimalFormat("0"));
        textoTotalAsistentes.setBounds(465, 290, 55, 25);
        textoTotalAsistentes.setEnabled(false);
        this.add(textoTotalAsistentes);

        textoTotalPorcentaje = new JFormattedTextField (new DecimalFormat("0.0"));
        textoTotalPorcentaje.setBounds(520, 290, 55, 25);
        textoTotalPorcentaje.setEnabled(false);
        this.add(textoTotalPorcentaje);

    }

    private JButton getBotonBuscar() {
        if (botonBuscar == null) {
            botonBuscar = new JButton();
            botonBuscar.setBounds(new Rectangle(30, 300, 80, 25));
            botonBuscar.setText(txt.getMessage("pantInformePorcentajeAsistencia.boton.buscar"));
            botonBuscar.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {

                    jScrollPane.setViewportView(getTablaResultados());

                }
            });
        }
        return botonBuscar;
    }

    private JComboBox getComboUniversidad() {

        if (comboUniversidad == null) {
            comboUniversidad = new JComboBox();
            Vector<MostrarCombo> vUniversidad = null;
            try {
                vUniversidad = objServeis.listaUniversidades();
                comboUniversidad = new JComboBox(vUniversidad);
                comboUniversidad.setBounds(new Rectangle(150, 10, 320, 25));

                // Evento para cargar Centros al seleccionar Universidad.
                comboUniversidad.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        ComboUniversidadActionPerformed(evt);
                    }
                });

            } catch (Exception eRe) {
                JOptionPane.showMessageDialog(null,
                        txt.getMessage("Informe.error.remoto") + "\n" + eRe.getMessage(),
                        txt.getMessage("Informe.error"), JOptionPane.ERROR_MESSAGE);

            }

        }
        return comboUniversidad;
    }

    // Evento que carga los centros al seleccionar universidad.
    private void ComboUniversidadActionPerformed(java.awt.event.ActionEvent evt) {
        CargarCentros(new Integer(((MostrarCombo) comboUniversidad.getSelectedItem()).getID()));
    }

    // Evento que carga los tipos de evento al seleccionar centro.
    private void ComboCentroActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            rellenarTiposEvento(new Integer(((MostrarCombo) comboCentro.getSelectedItem()).getID()));
        } catch (RemoteException ex) {
            JOptionPane.showMessageDialog(null,
                UtilLenguaje.getMessage("err.remoto") + "\n" + ex.getMessage(),
                UtilLenguaje.getMessage("err"), JOptionPane.ERROR_MESSAGE);
        }
    }

    private void CargarCentros(Integer IdUniversidad) {
        try {
            rellenarCentros(IdUniversidad);
        } catch (RemoteException ex) {
            JOptionPane.showMessageDialog(null,
                UtilLenguaje.getMessage("err.remoto") + "\n" + ex.getMessage(),
                UtilLenguaje.getMessage("err"), JOptionPane.ERROR_MESSAGE);
        }

        // Cargamos los tipos de evento ya que habrÃ¡ modificado el Centro.
        MostrarCombo centroCombo = (MostrarCombo) comboCentro.getSelectedItem();
        if (centroCombo != null){
            CargarTiposEvento(new Integer(((MostrarCombo) comboCentro.getSelectedItem()).getID()));
        }else{
            CargarTiposEvento(0);
        }
    }

    // Cargar los centros a partir de la Universidad seleccionada.
    private void rellenarCentros(Integer idUniversidad) throws RemoteException {
        Vector<MostrarCombo> listaCentrosUniversidad = objServeis.listaCentrosUniversidad(idUniversidad);
        comboCentro.setModel(new javax.swing.DefaultComboBoxModel(listaCentrosUniversidad));
    }

    private void CargarTiposEvento(Integer IdCentro) {
        try {
            rellenarTiposEvento(IdCentro);
        } catch (RemoteException ex) {
            JOptionPane.showMessageDialog(null,
                UtilLenguaje.getMessage("err.remoto") + "\n" + ex.getMessage(),
                UtilLenguaje.getMessage("err"), JOptionPane.ERROR_MESSAGE);
        }
    }

    // Cargar los tipos de evento a partir del centro seleccionado.
    private void rellenarTiposEvento(Integer idCentro) throws RemoteException {
        Vector<MostrarCombo> listaTiposEvento = objServeis.listaTipoEventosCelebrados(idCentro);
        comboTipoEvento.setModel(new javax.swing.DefaultComboBoxModel(listaTiposEvento));
    }


    class MyTableModel extends AbstractTableModel {

        private static final long serialVersionUID = 1L;
        protected List vCapcelera = new ArrayList();
        protected List vFilas = new ArrayList();

        public MyTableModel(List<InformePorcentajeAsistenciaEvento> vCv) {
            setCapcelera();
            setResulTabla(vCv);
        }

        protected void setCapcelera() {
            vCapcelera.add(txt.getMessage("pantInformePorcentajeAsistencia.tabla.universidad"));
            vCapcelera.add(txt.getMessage("pantInformePorcentajeAsistencia.tabla.centro"));
            vCapcelera.add(txt.getMessage("pantInformePorcentajeAsistencia.tabla.evento"));
            vCapcelera.add(txt.getMessage("pantInformePorcentajeAsistencia.tabla.tipoevento"));
            vCapcelera.add(txt.getMessage("pantInformePorcentajeAsistencia.tabla.fechainicio"));
            vCapcelera.add(txt.getMessage("pantInformePorcentajeAsistencia.tabla.fechafin"));
            vCapcelera.add(txt.getMessage("pantInformePorcentajeAsistencia.tabla.plazas"));
            vCapcelera.add(txt.getMessage("pantInformePorcentajeAsistencia.tabla.inscritos"));
            vCapcelera.add(txt.getMessage("pantInformePorcentajeAsistencia.tabla.asistentes"));
            vCapcelera.add(txt.getMessage("pantInformePorcentajeAsistencia.tabla.porcentaje"));

        }

        private void setResulTabla(List<InformePorcentajeAsistenciaEvento> vCv) {
            DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            try {
                List<String> universidad = new ArrayList();
                List<String> centro = new ArrayList();
                List<String> evento = new ArrayList();
                List<String> tipoevento = new ArrayList();
                List<String> fechainicio = new ArrayList();
                List<String> fechafin = new ArrayList();
                List<Integer> plazas = new ArrayList();
                List<Integer> inscritos = new ArrayList();
                List<Integer> asistentes = new ArrayList();
                List<Float> porcentaje = new ArrayList();

                int totalPlazas = 0;
                int totalInscritos = 0;
                int totalAsistencia = 0;
                float totalPorcentaje= 0;

                for (Iterator<InformePorcentajeAsistenciaEvento> it = vCv.iterator(); it.hasNext();) {
                    InformePorcentajeAsistenciaEvento cv = it.next();
                    universidad.add(cv.getUniversidad());
                    centro.add(cv.getCentro());
                    evento.add(cv.getEvento());
                    tipoevento.add(cv.getTipoEvento());
                    fechainicio.add(sdf.format(cv.getFechaInicio()));
                    fechafin.add(sdf.format(cv.getFechaFin()));
                    plazas.add(cv.getPlazas());
                    inscritos.add(cv.getInscritos());
                    asistentes.add(cv.getAsistentes());
                    porcentaje.add(cv.getPorcentajes());

                    totalPlazas = totalPlazas + cv.getPlazas();
                    totalInscritos = totalInscritos + cv.getInscritos();
                    totalAsistencia = totalAsistencia + cv.getAsistentes();
                    totalPorcentaje = totalPorcentaje + cv.getPorcentajes();
                }

                vFilas.add(universidad);
                vFilas.add(centro);
                vFilas.add(evento);
                vFilas.add(tipoevento);
                vFilas.add(fechainicio);
                vFilas.add(fechafin);
                vFilas.add(plazas);
                vFilas.add(inscritos);
                vFilas.add(asistentes);
                vFilas.add(porcentaje);

                textoTotalPlazas.setValue(totalPlazas);
                textoTotalInscritos.setValue(totalInscritos);
                textoTotalAsistentes.setValue(totalAsistencia);
                textoTotalPorcentaje.setValue(totalPorcentaje / vCv.size());


            } catch (Exception e) {
            }
        }

        public int getRowCount() {
            return (((List) vFilas.get(0)).size());
        }

        public int getColumnCount() {
            return (vFilas.size());
        }

        public String getColumnName(int col) {
            return ((String) vCapcelera.get(col));
        }

        public boolean getScrollableTrackViewportHeight() {
            return (true);
        }

        public boolean getScrollableTrackViewportWidth() {
            return (true);
        }

        public Object getValueAt(int fila, int col) {
            return (((List) vFilas.get(col)).get(fila));
        }

        public boolean isCellEditable(int fila, int columna) {
            return (false);
        }
    }

    private JScrollPane getJScrollPane() {
        if (jScrollPane == null) {
            jScrollPane = new JScrollPane();
            jScrollPane.setBounds(new Rectangle(10, 210, 570, 80));
        }
        jScrollPane.setVisible(true);
        return jScrollPane;
    }

    private JTable getTablaResultados() {
        try {

            Integer idUniversidad;
            Integer idCentro;
            Integer idTipoEvento;

            MostrarCombo universidadCombo = (MostrarCombo) comboUniversidad.getSelectedItem();
            if (universidadCombo != null){
                idUniversidad = universidadCombo.getID();
            }else{
                idUniversidad = 0;
            }

            MostrarCombo centroCombo = (MostrarCombo) comboCentro.getSelectedItem();
            if (centroCombo != null){
                idCentro = centroCombo.getID();
            }else{
                idCentro = 0;
            }

            MostrarCombo tipoeventoCombo = (MostrarCombo) comboTipoEvento.getSelectedItem();
            if (tipoeventoCombo != null){
                idTipoEvento = tipoeventoCombo.getID();
            }else{
                idTipoEvento = 0;
            }

            java.util.Date utilDateFIni = new java.util.Date();
            utilDateFIni = FormatoFecha.parse(textoFechaInicio.getText());
            java.sql.Date sqlDateFIni = new java.sql.Date(utilDateFIni.getTime());

            java.util.Date utilDateFFin = new java.util.Date();
            utilDateFFin = FormatoFecha.parse(textoFechaFinal.getText());
            java.sql.Date sqlDateFFin = new java.sql.Date(utilDateFFin.getTime());

            String PorcentajeMinStr = textoPorcentajeMin.getText();
            Integer porcentajeMin = Integer.parseInt(PorcentajeMinStr);

            String PorcentajeMaxStr = textoPorcentajeMax.getText();
            Integer porcentajeMax = Integer.parseInt(PorcentajeMaxStr);

            try {

                List informe = objServeis.listaInformePorcentajeAsistenciaEvento(idUniversidad, idCentro, idTipoEvento, sqlDateFIni, sqlDateFFin, porcentajeMin, porcentajeMax);

                MyTableModel myTableModel = new MyTableModel(informe);
                tabla.setModel(myTableModel);
                jScrollPane.setVisible(true);

            } catch (Exception u) {
                System.out.print(u);
            }

        } catch (Exception eRe) {
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("client.err.remot") + "\n" + eRe.getMessage(),
                    txt.getMessage("client.err"), JOptionPane.ERROR_MESSAGE);
        }
        return tabla;
    }
}
